package com.atguigu.bigdata.spark.zzgcore.wc

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Classname Spark01_WorldCount
 * @Description world count 1
 * @Date 2023/9/16 18:00
 * @Author zhuzhenguo
 */
object Spark01_WordCount {
  def main(args: Array[String]): Unit = {

    /*Spark框架、Application
      如何让spark框架去运行应用程序? spark框架是套环境，运行应用程序的环境
      和连接mysql数据库是很像的，mysql数据库是关系型数据库，提供了数据库的服务
      应用程序连接spark的环境，把功能传递给它，让它执行
     */

    // step 1: 建立和spark框架的连接
    val sparkConf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val sc = new SparkContext(sparkConf)

    // step 2: 执行业务操作
    // 1、读取文件，获取一行一行的数据，“hello world”
    val lines: RDD[String] = sc.textFile("datas")
    // 2、将一行数据进行拆分，形成一个一个单词（分词），扁平化：整体拆分为个体
    val words: RDD[String] = lines.flatMap(_.split(" "))
    // 3、将数据根据单词进行分组，便于统计
    // 依据自身分组
    val wordGroup: RDD[(String, Iterable[String])] = words.groupBy(word => word)
    // 4、对分组后的数据进行转换 （hello， hello， hello） => （hello， 3）
    val worldToCount = wordGroup.map {
      // 模式匹配
      case (word, list) => {
        (word, list.size)
      }
    }
    // 5、将转换结果采集到控制台
    val array: Array[(String, Int)] = worldToCount.collect()
    array.foreach(println)
    // step 3: 关闭连接
    sc.stop()
  }
}
